package Analizadores.Utilidades;

import Analizadores.AnalizadorLexico.CategoriaLexica;

//Clase para guardar el codigo que se va generando
public class GenCodigo {
	private String codigo;
	
	//constructora
	public GenCodigo(){
		codigo = "";
	}
	public String getCodigo(){
		return codigo;
	}
	//funcion para generar codigo de declaraciond de variable
	public void genDecVar(String decTipo,String decId,int numDir){
		codigo += decTipo + " " + decId +": Mem["+numDir+"]";
		codigo += "\n";
	}
	//escribe ampersan
	public void genAmpersan(){
		codigo+= "&";
		codigo+= "\n";
	}
	//escribe la instruccion in con su respectiva direccion
	public void generaIn(int dir){
		codigo+="in "+ dir;
		codigo+="\n";
	}
	//genera out, si ai una direccion esta valdra menos 1 entonces la apilamos antes para luego desapilarla
	public void generaOut(int dir){
		if (dir !=-1){
			apilaDir(dir);
		}
		codigo += "out";
		codigo +="\n";
	}
	//generamos operaciones binarios, las 4 primeras tienen sus nombres de operacion, las demas sera su lexema
	public void generaOp(CategoriaLexica cat,String op){
		if (cat == CategoriaLexica.CLSUMA) op = "sumar";
		else if (cat == CategoriaLexica.CLRESTA) op = "restar";
		else if (cat == CategoriaLexica.CLMUL) op = "multiplicar";
		else if (cat == CategoriaLexica.CLDIV) op = "dividir";
		codigo += op;
		codigo +="\n";
	}
	//generamos operaciones binario unicamente con su lexema
	public void generaOpUnario(String op){
		codigo+=op;
		codigo+= "\n";
	}
	//genera el casting, quitandole los parentesis solo dejando el tip
	public void generaOpCast(String op){
		op = op.substring(1, op.length()-1);
		codigo+=op;
		codigo+= "\n";
	}
	//genera apila con lexema del token
	public void apila(String lex){
		codigo+= "apila("+lex+")";
		codigo+= "\n";
	}
	//genera un apila direccion con la direccion de la variable
	public void apilaDir(int dir){
		codigo+= "apila-dir("+dir+")";
		codigo+= "\n";
	}
	//genera un desapila direccion con la direccion de la variable
	public void desapilaDir(int dir){
		codigo+= "desapila-dir("+dir+")";
		codigo+= "\n";
	}

}
